#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
  int fd = open("log.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);
  // int fd = open("log.txt",O_WRONLY | O_CREAT | O_APPEND,0666);
  //int fd = open("log.txt",O_RDONLY);
  if(fd < 0)
  {
    perror("open");
    return 0;
  }
  dup2(fd,0);
  dup2(fd,1);
  int ret = dup2(fd,1);
  if(ret > 0) close(fd);

  printf("ret : %d\n",ret);

  //本应该要往显示器打印，最终却变成了向指定文件打印->重定向吗？
  fprintf(stdout,"打开文件成功,fd:%d\n",fd);

  char line[64];

  while(fgets(line,sizeof(line),stdin) != NULL)
  {
    printf("%s",line);
  }

  //暂时不做解释 后面再说
  fflush(stdout);
  close(fd);


  return 0;
}

int main2()
{
  //printf没有立即刷新的原因，是因为有缓冲区的存在
  printf(" hello printf ");// stdout -> 1,->封装了write  
  fprintf(stdout," hello fprintf");
  fputs(" hello fputs",stdout);
  
  // write可是立即刷新的 ！ printf -> write
  //那么这个缓冲区在哪里呢？？只能是C语言提供的，语言界别的缓冲区
  //那么这个缓冲区不在哪里呢？一定不在write内部！我们曾经谈论的缓冲区不是内核级别的
  const char* msg = " hello write";
  write(1,msg,strlen(msg));

  close(1);

  sleep(5);

  close(stdout->_fileno);


  return 0;
}


int main1()
{
  const char* str1 = "hello printf\n";
  const char* str2 = "hello fprintf\n";
  const char* str3 = "hello fputs\n";
  const char* str4 = "hello write\n";
  
  //C库函数
  printf(str1);//
  fprintf(stdout,str2);
  fputs(str3,stdout);

  //系统接口
  write(1,str4,strlen(str4));

  //是调用完了上面的代码 才执行的fork
  fork();
  
  
  return 0;
}
